
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.    
 */

using System;
using System.Collections;
using Velocity4Net.App.Events;
using Velocity4Net.Runtime.ResourceManage;
using Velocity4Net.Util.Introspection;


namespace Velocity4Net.Ctx
{
    /**
     * This is an abstract internal-use-only context implementation to be
     * used as a subclass for other internal-use-only contexts that wrap
     * other internal-use-only contexts.
     *
     * We use this context to make it easier to chain an existing context
     * as part of a new context implementation.  It just delegates everything
     * to the inner/parent context. Subclasses then only need to override
     * the methods relevant to them.
     *
     * @author Nathan Bubna
     * @version $Id: ChainedInternalContextAdapter.java 685724 2008-08-13 23:12:12Z nbubna $
     * @since 1.6
     */
    public abstract class ChainedInternalContextAdapter : InternalContextAdapter
    {
        /** the parent context */
        protected InternalContextAdapter innerContext = null;

        /**
         * CTOR, wraps an ICA
         * @param inner context
         */
        public ChainedInternalContextAdapter(InternalContextAdapter inner)
        {
            innerContext = inner;
        }

        /**
         * Return the inner / user context.
         * @return The inner / user context.
         */
        public IContext InternalUserContext
        {
            get
            {
                return innerContext.InternalUserContext;
            }
        }

        /**
         * @see org.apache.velocity.context.InternalWrapperContext#getBaseContext()
         */
        public InternalContextAdapter BaseContext
        {
            get
            {
                return innerContext.BaseContext;
            }
        }

        /**
         * Retrieves from parent context.
         *
         * @param key name of item to get
         * @return  stored object or null
         */
        public virtual Object Get(String key)
        {
            return innerContext.Get(key);
        }

        /**
         * Put method also stores values in parent context
         *
         * @param key name of item to set
         * @param value object to set to key
         * @return old stored object
         */
        public virtual Object Put(String key, Object value)
        {
            /*
             * just put in the local context
             */
            return innerContext.Put(key, value);
        }

        /**
         * @see org.apache.velocity.context.Context#containsKey(java.lang.Object)
         */
        public virtual bool ContainsKey(Object key)
        {
            return innerContext.ContainsKey(key);
        }

        /**
         * @see org.apache.velocity.context.Context#getKeys()
         */
        public virtual ICollection Keys
        {
            get
            {
                return innerContext.Keys;
            }
        }

        /**
         * @see org.apache.velocity.context.Context#remove(java.lang.Object)
         */
        public virtual Object Remove(Object key)
        {
            return innerContext.Remove(key);
        }

        /**
         * @see org.apache.velocity.context.InternalHousekeepingContext#pushCurrentTemplateName(java.lang.String)
         */
        public void PushCurrentTemplateName(String s)
        {
            innerContext.PushCurrentTemplateName(s);
        }

        /**
         * @see org.apache.velocity.context.InternalHousekeepingContext#popCurrentTemplateName()
         */
        public void PopCurrentTemplateName()
        {
            innerContext.PopCurrentTemplateName();
        }

        /**
         * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentTemplateName()
         */
        public String CurrentTemplateName
        {
            get
            {
                return innerContext.CurrentTemplateName;
            }
        }

        /**
         * @see org.apache.velocity.context.InternalHousekeepingContext#getTemplateNameStack()
         */
        public Object[] TemplateNameStack
        {
            get
            {
                return innerContext.TemplateNameStack;
            }
        }

        /**
         * @see org.apache.velocity.context.InternalHousekeepingContext#pushCurrentMacroName(java.lang.String)
         */
        public void PushCurrentMacroName(String s)
        {
            innerContext.PushCurrentMacroName(s);
        }

        /**
         * @see org.apache.velocity.context.InternalHousekeepingContext#popCurrentMacroName()
         */
        public void PopCurrentMacroName()
        {
            innerContext.PopCurrentMacroName();
        }

        /**
         * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentMacroName()
         */
        public String CurrentMacroName
        {
            get
            {
                return innerContext.CurrentMacroName;
            }
        }

        /**
         * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentMacroCallDepth()
         */
        public int CurrentMacroCallDepth
        {
            get
            {
                return innerContext.CurrentMacroCallDepth;
            }
        }

        /**
         * @see org.apache.velocity.context.InternalHousekeepingContext#getMacroNameStack()
         */
        public Object[] MacroNameStack
        {
            get
            {
                return innerContext.MacroNameStack;
            }
        }

        /**
         * @see org.apache.velocity.context.InternalHousekeepingContext#icacheGet(java.lang.Object)
         */
        public IntrospectionCacheData ICacheGet(Object key)
        {
            return null;
            //return innerContext.icacheGet(key);
        }

        /**
         * @see org.apache.velocity.context.InternalWrapperContext#localPut(java.lang.String,java.lang.Object)
         */
        public virtual Object LocalPut(String key, Object value)
        {
            return innerContext.Put(key, value);
        }

        /**
         * @see org.apache.velocity.context.InternalHousekeepingContext#icachePut(java.lang.Object, org.apache.velocity.util.introspection.IntrospectionCacheData)
         */
        public void ICachePut(Object key, IntrospectionCacheData o)
        {
            //innerContext.icachePut(key, o);
        }

        /**
         * @see org.apache.velocity.context.InternalEventContext#attachEventCartridge(org.apache.velocity.app.event.EventCartridge)
         */
        public EventCartridge AttachEventCartridge(EventCartridge ec)
        {
            return innerContext.AttachEventCartridge(ec);
        }

        /**
         * @see org.apache.velocity.context.InternalEventContext#getEventCartridge()
         */
        public EventCartridge EventCartridge
        {
            get
            {
                return innerContext.EventCartridge;
            }
        }

        /**
         * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentResource()
         */
        public Resource CurrentResource
        {
            get
            {
                return innerContext.CurrentResource;
            }
            set
            {
                innerContext.CurrentResource = value;
            }
        }


        public IList MacroLibraries
        {
            get
            {
                return innerContext.MacroLibraries;
            }
            set
            {
                innerContext.MacroLibraries = value;
            }
        }
    }
}